home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
001-100
/
001-025
/
009
/
proff
/
pxlex.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-17
|
3KB
|
190 lines
#include <stdio.h>
#include <math.h>
#include <ctype.h>
/* translation table for control chars */
char c_ctrl[] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
23, 25, 26, 27, 28, 29, 30, 31, 0, 1, 2, 3, 4, 5,
6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
20, 21, 22, 23, 24, 25, 26, 0, 0, 0, 0, 0
};
/*
* getval - evaluate optional numeric argument
*
* increments i
*/
int
getval(buf,i,argtyp)
char buf[];
int *i;
int *argtyp;
{
int j,k;
j = *i;
k = *argtyp;
skipbl(buf, &j);
k = buf[j];
if (k == '+' || k == '-')
j++;
*i = j;
*argtyp = k;
return(ctoi(buf,i));
}
/*
* getarg - get the next argument from the buffer
*
* return values: -1 - no argument
* n - number of chars in argument
*
* also handles quoted ("..") strings. If a quote is wanted
* in the string, use "" or \". quotes are stripped.
*
* argument delimiters: blank, tab or comma (,).
*
* increments i
*
*/
int
getarg(buf,i,arg)
char buf[];
int *i;
char arg[];
{
int j,k;
register char ch;
j = *i;
k = -1;
skipbl(buf,&j);
if (buf[j] != '\0') {
k = 0;
if (buf[j] == '\"') {
j++;
while (buf[j] != '\0') {
if (buf[j] == '\"') {
if (buf[j+1] == '\"') {
arg[k++] = '\"';
j += 2;
}
else
break;
}
arg[k++] = buf[j++];
}
arg[k] = '\0';
j++; /* skip the quote */
/* peek next char */
if (isalnum(buf[j]))
error("improper argument list.");
j++; /* skip the delimeter */
}
else {
ch = buf[j];
while (ch != ' '&&
ch != '\t' &&
ch != ',' &&
ch != '\r' &&
ch != '\n' &&
ch != '\0') {
arg[k++] = buf[j++];
ch = buf[j];
}
arg[k] = '\0';
if (ch != '\0') /* if non-null delimiter, skip */
j++;
}
*i = j;
}
return(k);
}
/*
* getpstr - get a special string to print out
*
*/
getpstr(buf,out)
register char *buf;
register char *out;
{
register int i;
register char c, cc;
register char *num;
char numbuf[9];
while(*buf != '\n' && *buf != '\0') {
c = *buf;
switch(c) {
case ' ':
case '\t':
while (*buf == ' ' || *buf == '\t')
buf++; /* skip blanks */
break;
case '\\':
if (*(buf+1) != '\0') {
*out++ = *(buf+1);
buf += 2;
}
else
buf++;
break;
case '^':
if ((cc = c_ctrl[*(buf+1)]) != 0)
*out++ = cc;
buf += 2;
break;
case '\"':
buf++; /* skip the quote */
while (*buf != '\0') {
if (*buf != '\"')
*out++ = *buf++;
else if (*(buf+1) == '\"') {
*out++ = '\"';
buf += 2;
}
else
break;
}
buf++; /* skip the quote */
break;
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
num = numbuf;
while (isdigit(*buf))
*num++ = *buf++;
*num = '\0';
if ((i = atoi(numbuf)) > 256)
error("non-ascii char value in write string.");
else if (i > 0) /* do not output null */
*out++ = (char) i;
break;
default:
*out++ = *buf++;
}
}
*out = '\0';
}